www.gusucode.com > VC++ XP风格复活节彩蛋源码-源码程序 > VC++ XP风格复活节彩蛋源码-源码程序/code/MainFrm.cpp
//Download by http://www.NewXing.com ////////////////////////////////////////////////////////////////////////////// //类名:CMainFrame //功能:主框架操作类 //作者:徐景周(jingzhou_xu@163.net) //组织:未来工作室(Future Studio) //日期:2002.8.1 ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "XPEasterEgg.h" #include "MainFrm.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMainFrame IMPLEMENT_DYNCREATE(CMainFrame, CNewFrameWnd); //更换新的XP菜单框架 //IMPLEMENT_MENUXP(CMainFrame, CFrameWnd, true); //实现XP风格菜单映射 BEGIN_MESSAGE_MAP(CMainFrame, CNewFrameWnd) //更换新的XP菜单框架 //{{AFX_MSG_MAP(CMainFrame) // NOTE - the ClassWizard will add and remove mapping macros here. // DO NOT EDIT what you see in these blocks of generated code ! ON_WM_CREATE() ON_WM_NCLBUTTONDOWN() //非客户区左键按下时消息,jingzhou xu ON_WM_NCMOUSEMOVE() //非客户区鼠标移动时消息,jingzhou xu //}}AFX_MSG_MAP // ON_MENUXP_MESSAGES() //XP风格菜单映射 END_MESSAGE_MAP() static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, }; ///////////////////////////////////////////////////////////////////////////// // CMainFrame construction/destruction CMainFrame::CMainFrame() { // TODO: add member initialization code here } CMainFrame::~CMainFrame() { } // --------------------------------------------------------------------------- // 名称: OnCreate // 功能: 创建窗体 // 作者: 徐景周(jingzhou xu) // 组织: 未来工作室(Future Studio) // --------------------------------------------------------------------------- int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CNewFrameWnd::OnCreate(lpCreateStruct) == -1) //更换新的XP菜单框架 return -1; if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // fail to create } m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); //设置XP风格菜单显示 static UINT uToolBars[] = { IDR_MAINFRAME, }; m_DefaultNewMenu.LoadToolBars(uToolBars, sizeof(uToolBars)/sizeof(UINT) ); m_SystemNewMenu.SetMenuTitle(_T("未来工作室"),MFT_LINE|MFT_CENTER|MFT_ROUND); return 0; } // --------------------------------------------------------- // 名称: PreCreateWindow // 功能: 去掉系统菜单,用XP风格框架显示 // 变量: cs -- 结构风格 // 返回: BOOL -- 成功,FALSE -- 失败 // 编写: 徐景周,2002.4.8 // --------------------------------------------------------- BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { cs.style &= ~WS_SYSMENU; //去掉系统菜单,避免XP风格窗体下,在98/2000下鼠标点击标题或菜单时,系统按钮暴露问题,jingzhou xu if( !CNewFrameWnd::PreCreateWindow(cs) ) //更换新的XP菜单框架 return FALSE; return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CMainFrame diagnostics #ifdef _DEBUG void CMainFrame::AssertValid() const { CNewFrameWnd::AssertValid(); //更换新的XP菜单框架 } void CMainFrame::Dump(CDumpContext& dc) const { CNewFrameWnd::Dump(dc); //更换新的XP菜单框架 } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CMainFrame message handlers // --------------------------------------------------------- // 名称: DrawXPBmp // 功能: 绘制XP风格的背景位图 // 变量: pDC -- 设备指针,ID -- 资源ID,pt1, pt2 -- 点位置 // 返回: 无 // 编写: 徐景周,2002.4.8 // --------------------------------------------------------- void CMainFrame::DrawXPBmp(CDC *pDC,int ID,CPoint pt1,CPoint pt2) { CDC *memdc=new CDC; CRect rect; CBitmap bitmap; BITMAP szbitmap; bitmap.LoadBitmap(ID); bitmap.GetObject(sizeof(BITMAP),&szbitmap); CSize size(szbitmap.bmWidth,szbitmap.bmHeight); memdc->CreateCompatibleDC(pDC); CBitmap *oldbitmap=memdc->SelectObject(&bitmap); pDC->StretchBlt(pt1.x,pt1.y,pt2.x,pt2.y,memdc,0,0,size.cx ,size.cy ,SRCCOPY); memdc->SelectObject(oldbitmap); memdc->DeleteDC(); if( memdc ) delete memdc; } // --------------------------------------------------------- // 名称: DrawTitleBar // 功能: 绘制具有XP风格的窗体框架 // 变量: pDC -- 设备指针 // 返回: 无 // 修改: 徐景周,2002.4.8 // --------------------------------------------------------- void CMainFrame::DrawTitleBar(CDC *pDC) { if (m_hWnd) { CBrush Brush(RGB(10,80,240)); CBrush* pOldBrush = pDC->SelectObject(&Brush); CRect rtWnd, rtTitle, rtButtons; GetWindowRect(&rtWnd); //取得标题栏的位置 rtTitle.left = GetSystemMetrics(SM_CXFRAME); rtTitle.top = GetSystemMetrics(SM_CYFRAME); rtTitle.right = rtWnd.right - rtWnd.left - GetSystemMetrics(SM_CXFRAME); rtTitle.bottom = rtTitle.top + GetSystemMetrics(SM_CYSIZE); //用位图填充来做窗体边框 CPoint point; point.x = GetSystemMetrics(SM_CXFRAME) + 1; //左边框 point.y = rtWnd.Height(); DrawXPBmp(pDC,IDB_LEFT,CPoint(0,0),CPoint(point.x,point.y)); point.x = rtWnd.Width(); //底边框 point.y = GetSystemMetrics(SM_CYFRAME) + 1; DrawXPBmp(pDC,IDB_BOTTOM,CPoint(0, rtWnd.Height()-point.y), CPoint(point.x, point.y)); point.x = GetSystemMetrics(SM_CXFRAME) + 1; //右边框 point.y = rtWnd.Height(); DrawXPBmp(pDC,IDB_RIGHT,CPoint(rtWnd.Width()-point.x, 0), CPoint(point.x, point.y)); point.x = rtWnd.Width(); //顶边框 point.y = GetSystemMetrics(SM_CYSIZE) + GetSystemMetrics(SM_CYFRAME); DrawXPBmp(pDC,IDB_TOP,CPoint(0,0),CPoint(point.x,point.y)); //重画图标 m_rtIcon.left = rtTitle.left ; m_rtIcon.top = rtTitle.top; m_rtIcon.right = m_rtIcon.left + 16; m_rtIcon.bottom = m_rtIcon.top + 15; ::DrawIconEx(pDC->m_hDC, m_rtIcon.left, m_rtIcon.top, AfxGetApp()->LoadIcon(IDR_MAINFRAME), m_rtIcon.Width(), m_rtIcon.Height(), 0, NULL, DI_NORMAL); m_rtIcon.OffsetRect(rtWnd.TopLeft()); //准备画XP风格按钮 CBitmap* pBitmap = new CBitmap; CBitmap* pOldBitmap; CDC* pDisplayMemDC=new CDC; pDisplayMemDC->CreateCompatibleDC(pDC); //重画关闭button rtButtons.left = rtTitle.right - 16; rtButtons.top = rtTitle.top; rtButtons.right = rtButtons.left + 16; rtButtons.bottom = rtButtons.top + 15; pBitmap->LoadBitmap(IDB_EXIT_NORMAL); pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY); pDisplayMemDC->SelectObject(pOldBitmap); m_rtButtExit = rtButtons; m_rtButtExit.OffsetRect(rtWnd.TopLeft()); pBitmap->DeleteObject(); //重画最大化/恢复button rtButtons.right = rtButtons.left - 3; rtButtons.left = rtButtons.right - 16; if (IsZoomed()) pBitmap->LoadBitmap(IDB_RESTORE_NORMAL); else pBitmap->LoadBitmap(IDB_MAX_NORMAL); pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY); pDisplayMemDC->SelectObject(pOldBitmap); m_rtButtMax = rtButtons; m_rtButtMax.OffsetRect(rtWnd.TopLeft()); pBitmap->DeleteObject(); //重画最小化button rtButtons.right = rtButtons.left - 3; rtButtons.left = rtButtons.right - 16; pBitmap->LoadBitmap(IDB_MIN_NORMAL); pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); pDC->BitBlt(rtButtons.left, rtButtons.top, rtButtons.Width(), rtButtons.Height(), pDisplayMemDC, 0, 0, SRCCOPY); pDisplayMemDC->SelectObject(pOldBitmap); m_rtButtMin = rtButtons; m_rtButtMin.OffsetRect(rtWnd.TopLeft()); pBitmap->DeleteObject(); //重画caption int nOldMode = pDC->SetBkMode(TRANSPARENT); COLORREF clOldText=pDC->SetTextColor(::GetSysColor(COLOR_3DSHADOW)); LOGFONT logFont; //获取标题栏字体 SystemParametersInfo( SPI_GETICONTITLELOGFONT, 0, &logFont, 0); CFont m_captionFont; m_captionFont.CreateFontIndirect(&logFont); CFont* pOldFont = NULL; //zwh Adding,2002.6.20 pOldFont = pDC->SelectObject(&m_captionFont); rtTitle.left += m_rtIcon.Width ()+3; rtTitle.top = rtTitle.top; rtTitle.bottom = rtTitle.top + 30; CString m_strTitle; GetWindowText(m_strTitle); //3D显示文字 pDC->DrawText(m_strTitle, rtTitle+CPoint(3,3), DT_LEFT); pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT)); pDC->DrawText(m_strTitle, rtTitle, DT_LEFT); pDC->SetBkMode(nOldMode); pDC->SetTextColor(clOldText); //zwh Adding,2002.6.20 if (pOldFont != NULL) { pDC->SelectObject(pOldFont); m_captionFont.DeleteObject(); } //zwh Modifing,2002.6.20 //ReleaseDC(pDisplayMemDC); pDisplayMemDC->DeleteDC(); delete pDisplayMemDC; delete pBitmap; } } // --------------------------------------------------------- // 名称: OnNcLButtonDown // 功能: 绘制XP风格窗体的消息 // 变量: nHitTest -- 点在哪里,point -- 点信息 // 返回: 无 // 修改: 徐景周,2002.4.8 // --------------------------------------------------------- void CMainFrame::OnNcLButtonDown(UINT nHitTest, CPoint point) { //检测各按钮是否按到 if (m_rtButtExit.PtInRect(point)) SendMessage(WM_CLOSE); else if (m_rtButtMin.PtInRect(point)) SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(point.x, point.y)); else if (m_rtButtMax.PtInRect(point)) { if (IsZoomed()) SendMessage(WM_SYSCOMMAND, SC_RESTORE, MAKELPARAM(point.x, point.y)); else { SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(point.x, point.y)); Invalidate(); } } else Default(); } // --------------------------------------------------------- // 名称: OnNcMouseMove // 功能: 绘制XP风格窗体的消息 // 变量: nHitTest -- 点在哪里,point -- 点信息 // 返回: 无 // 修改: 徐景周,2002.4.8 // --------------------------------------------------------- void CMainFrame::OnNcMouseMove(UINT nHitTest, CPoint point) { CWindowDC dc(this); CWindowDC* pDC = &dc; CDC* pDisplayMemDC=new CDC; pDisplayMemDC->CreateCompatibleDC(pDC); CBitmap* pBitmap = new CBitmap; CBitmap* pOldBitmap; CRect rtWnd, rtButton; if (pDC) { GetWindowRect(&rtWnd); //关闭button if (m_rtButtExit.PtInRect(point)) pBitmap->LoadBitmap(IDB_EXIT_FOCUS); else pBitmap->LoadBitmap(IDB_EXIT_NORMAL); rtButton = m_rtButtExit; rtButton.OffsetRect(-rtWnd.left, -rtWnd.top); pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY); pDisplayMemDC->SelectObject(pOldBitmap); pBitmap->DeleteObject(); //最大化/恢复button if (m_rtButtMax.PtInRect(point)) { if (IsZoomed()) pBitmap->LoadBitmap(IDB_RESTORE_FOCUS); else pBitmap->LoadBitmap(IDB_MAX_FOCUS); } else { if (IsZoomed()) pBitmap->LoadBitmap(IDB_RESTORE_NORMAL); else pBitmap->LoadBitmap(IDB_MAX_NORMAL); } rtButton = m_rtButtMax; rtButton.OffsetRect(-rtWnd.left, -rtWnd.top); pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY); pDisplayMemDC->SelectObject(pOldBitmap); pBitmap->DeleteObject(); //最小化button if (m_rtButtMin.PtInRect(point)) pBitmap->LoadBitmap(IDB_MIN_FOCUS); else pBitmap->LoadBitmap(IDB_MIN_NORMAL); rtButton = m_rtButtMin; rtButton.OffsetRect(-rtWnd.left, -rtWnd.top); pOldBitmap=(CBitmap*)pDisplayMemDC->SelectObject(pBitmap); pDC->BitBlt(rtButton.left, rtButton.top, rtButton.Width(), rtButton.Height(), pDisplayMemDC, 0, 0, SRCCOPY); pDisplayMemDC->SelectObject(pOldBitmap); pBitmap->DeleteObject(); } pDisplayMemDC->DeleteDC(); delete pDisplayMemDC; delete pBitmap; CNewFrameWnd::OnNcMouseMove(nHitTest, point); //更换新的XP菜单框架 } // --------------------------------------------------------- // 名称: DefWindowProc // 功能: 在此设置横排、竖排消息及框架XP风格绘制 // 变量: message -- 消息,wParam, lParam -- 消息参数 // 返回: 无 // 编写: 徐景周,2002.4.8 // --------------------------------------------------------- LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { //加入绘制XP风格窗体的消息 LRESULT lrst=CNewFrameWnd::DefWindowProc(message, wParam, lParam); //更换新的XP菜单框架 if (!::IsWindow(m_hWnd)) return lrst; if (message==WM_MOVE||message==WM_PAINT||message==WM_NCPAINT||message==WM_NCACTIVATE||message==WM_SETTEXT) { try { CWindowDC dc(this); if (&dc) DrawTitleBar(&dc); } catch( CException* e ) { e->Delete(); } } return lrst; }